1. 最小化经验风险
利用训练集上的经验分布, p^( x , y ) 替代真实分布 p ( x , y ) 。 现在,我们将最小化经验风险:
其中 m 表示训练样本的数目。
2.小批量算法
通常,在所有训练集上准确计算优化参数计算代价非常大,因为我们需要在整个数据集上的每个样本上评估模型。
在实践中,我们可以从数据集中随机采样少量的样本,然后计算这些样本上的平均值。
随机方法的典型示例是随机梯度下降,小批量的大小通常由以下几个因素决定:
- 更大的批量会计算更精确的梯度估计,但是回报却是小于线性的。
- 极小批量通常难以充分利用多核架构。 这促使我们使用一些绝对最小批量,低于这个值的小批量处理不会减少计算时间。
- 如果批量处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和批量大小会正比。 对于很多硬件设施,这是批量大小的限制因素。
- 在某些硬件上使用特定大小的数组时,运行时间会更少。 尤其是在使用,GPU,时,通常使用 2 的幂数作为批量大小可以获得更少的运行时间。一般, 2的幂数的取值范围是 32 到 256 , 16 有时在尝试大模型时使用。
- 可能是由于小批量在学习过程中加入了噪声,它们会有一些正则化效果。 泛化误差通常在批量大小为 1 时最好。因为梯度估计的高方差,小批量训练需要较小的学习率以保持稳定性。因为降低的学习率和消耗更多步骤来遍历整个训练集都会产生更多的步骤,所以会导致总的运行时间非常大。
3.神经网络优化中的挑战
3.1 病态
在优化凸函数时,会遇到一些挑战。 这其中最突出的是Hessian矩阵的病态。
我们通常通过(方向)二阶导数预期一个梯度下降步骤能表现得多好。如果我们使用学习率 ϵ ,那么新的点 x 将会是 x ( 0 ) − ϵg 。我们在该点处作函数 f ( x ) 的近似二阶泰勒级数:
当 $$1/2ϵ^2g^THg$$ 超过 $$ϵg⊤g$$ 时,梯度的病态会成为问题。
判断病态是否不利于神经网络训练任务,我们可以监测平方梯度范数$$g^⊤g$$和$$g^⊤Hg$$。
在很多情况中,梯度范数不会在训练过程中显著缩小,但是$$g^⊤Hg$$的增长会超过一个数量级。
其结果是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。
3.2 局部极小值
如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为辨识性的。由于模型可辨识性问题,神经网络和任意具有多个等效参数化潜变量的模型都会具有多个局部极小值。 带有潜变量的模型通常是不可辨认的,因为通过相互交换潜变量我们能得到等价的模型。 例如,考虑神经网络的第一层,我们可以交换单元i和单元j的传入权重向量、传出权重向量而得到等价的模型。如果神经网络有m层,每层有n个单元,那么会有n!m种排列隐藏单元的方式。
这种不可辨认性被称为权重空间对称性。
除了权重空间对称性,很多神经网络还有其他导致不可辨认的原因。 例如,在任意整流线性网络或者maxout网络中, 我们可以将传入权重和偏置扩大α倍,然后将传出权重扩大1/α倍,而保持模型等价。
这意味着,如果代价函数不包括如权重衰减这种直接依赖于权重而非模型输出的项,那么整流线性网络或者maxout网络的每一个局部极小点都在等价的局部极小值的(m×n)维双曲线上。
3.3 高原、鞍点和其他平坦区域
对于很多高维非凸函数而言,局部极小值(以及极大值)事实上都远少于另一类梯度为零的点:鞍点。 鞍点附近的某些点比鞍点有更大的代价,而其他点则有更小的代价。
在鞍点处,Hessian,矩阵同时具有正负特征值。
位于正特征值对应的特征向量方向的点比鞍点有更大的代价,反之,位于负特征值对应的特征向量方向的点有更小的代价。
我们可以将鞍点视为代价函数某个横截面上的局部极小点,同时也可以视为代价函数某个横截面上的局部极大点。
3.4 悬崖和梯度爆炸
其基本想法源自梯度并没有指明最佳步长,只说明了在无限小区域内的最佳方向。
当传统的梯度下降算法提议更新很大一步时,启发式梯度截断会干涉来减小步长,从而使其不太可能走出梯度近似为最陡下降方向的悬崖区域。
3.5 长期依赖
当计算图变得极深时,神经网络优化算法会面临的另外一个难题就是长期依赖问题——由于变深的结构使模型丧失了学习到先前信息的能力,让优化变得极其困难。
深层的计算图不仅存在于前馈网络,还存在于之后介绍的循环网络中。
因为循环网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图,并且模型参数共享,这使问题更加凸显。
3.6 非精确梯度
大多数优化算法的先决条件都是我们知道精确的梯度或是Hessian矩阵。
在实践中,通常这些量会有噪声,甚至是有偏的估计。几乎每一个深度学习算法都需要基于采样的估计,至少使用训练样本的小批量来计算梯度。
在其他情况,我们希望最小化的目标函数实际上是难以处理的。 当目标函数不可解时,通常其梯度也是难以处理的。
各种神经网络优化算法的设计都考虑到了梯度估计的缺陷。 我们可以选择比真实损失函数更容易估计的代理损失函数来避免这个问题。
3.7 局部和全局结构间的弱对应
4.基本算法
4.1 SGD
SGD算法中的一个关键参数是学习率。 之前,我们介绍的SGD使用固定的学习率。 在实践中,有必要随着时间的推移逐渐降低学习率,因此我们将第k步迭代的学习率记作 ϵ k 。
实践中,一般会线性衰减学习率直到第 τ 次迭代:
$$ ϵ_k=(1−α)ϵ_0+αϵt $$
其中$$ α=kτ $$ 。 在 τ 步迭代之后,一般使 ϵ 保持常数。
4.2 动量
速度 v 累积了梯度元素 $$∇θ(1/m∑ m _{i = 1} L ( f ( x ( i ) ; θ ), y ( i ) ) )$$ 。 相对于ϵ , α 越大,之前梯度对现在方向的影响也越大。之前,步长只是梯度范数乘以学习率。
现在,步长取决于梯度序列的大小和排列。 当许多连续的梯度指向相同的方向时,步长最大。
4.3 Nesterov 动量
Nesterov 动量可以解释为往标准动量方法中添加了一个校正因子。
在凸批量梯度的情况下,Nesterov 动量将额外误差收敛率从 O ( 1 / k ) ( k 步后)改进到 O ( 1 / k
2 ) 可惜,在随机梯度的情况下,Nesterov 动量没有改进收敛率。
5. 参数初始化策略
一种初始化 m 个输入和 n 输出的全连接层的权重的启发式方法是从分布 U ( − 1/ √ m , 1/√ m )中采样权重, 而Bingo建议使用标准初始化:
martens提出了一种被称为稀疏初始化的方案,每个单元初始化为恰好有 k 个非零权重。 这个想法保持该单元输入的总数量独立于输入数目 m,而不使单一权重元素的大小随 m 缩小。 稀疏初始化有助于实现单元之间在初始化时更具多样性。 但是,获得较大取值的权重也同时被加了很强的先验。
因为梯度下降需要很长时间缩小“不正确”的大值,这个初始化方案可能会导致某些单元出问题,例如,maxout单元有几个过滤器,互相之间必须仔细调整。
设置偏置的方法必须和设置权重的方法协调。 设置偏置为零通常在大多数权重初始化方案中是可行的。
6. 自适应学习率算法
6.1 AdaGrad
AdaGrad算法,如下图所示,能独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。
具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。 净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。
在凸优化背景中,AdaGrad 算法具有一些令人满意的理论性质。
然而,经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。
AdaGrad在某些深度学习模型上效果不错,但不是全部。
6.2 RMSProp
RMSProp算法修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。 AdaGrad旨在应用于凸问题时快速收敛。
当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。
AdaGrad根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小了。
RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛, 它就像一个初始化于该碗状结构的AdaGrad算法实例。
RMSProp的标准形式如算法8.5所示,算法8.6为结合Nesterov动量的形式。 相比于AdaGrad,使用移动平均引入了一个新的超参数 ρ,用来控制移动平均的长度范围。
6.3 Adam
首先,在Adam中,动量直接并入了梯度一阶矩(指数加权)的估计。 将动量加入RMSProp最直观的方法是将动量应用于缩放后的梯度。
结合缩放的动量使用没有明确的理论动机。 其次,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计。
RMSProp也采用了(非中心的)二阶矩估计,然而缺失了修正因子。 因此,不像Adam,RMSProp二阶矩估计可能在训练初期有很高的偏置。
Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
7. 二阶近似方法
7.1 牛顿法
牛顿法是基于二阶泰勒级数展开在某点$$θ_0$$附近来近似 J ( θ ) 的优化方法,其忽略了高阶导数:
其中 H 是 J 相对于 θ 的Hessian矩阵在 $$θ_0$$处的估计。 如果我们再求解这个函数的临界点,我们将得到牛顿参数更新规则:
因此,对于局部的二次函数(具有正定的 H ,),用$$H^{−1}$$重新调整梯度,牛顿法会直接跳到极小值。
如果目标函数是凸的但非二次的(有高阶项),该更新将是迭代的,得到和牛顿法相关的算法,如算法8.8所示。
牛顿法只适用于Hessian矩阵是正定的情况。 在深度学习中,目标函数的表面通常非凸(有很多特征),如鞍点。如果Hessian矩阵的特征值并不都是正的,例如,靠近鞍点处,牛顿法实际上会导致更新朝错误的方向移动。 这种情况可以通过正则化Hessian矩阵来避免。
常用的正则化策略包括在Hessian矩阵对角线上增加常数 α 。 正则化更新变为
只要Hessian矩阵的负特征值仍然相对接近零,效果就会很好。 在曲率方向更极端的情况下, α 的值必须足够大,以抵消负特征值。 然而,如果α持续增加,Hessian,矩阵会变得由对角矩阵 α I 主导,通过牛顿法所选择的方向会收敛到普通梯度除以 α 。 当很强的负曲率存在时, α可能需要特别大,以致于牛顿法比选择合适学习率的梯度下降的步长更小。
7.2 共轭梯度
对于二次曲面而言,共轭方向确保梯度沿着前一方向大小不变。 因此,我们在前一方向上仍然是极小值。 其结果是,在k维参数空间中,共轭梯度只需要至多k次线搜索就能达到极小值。
8. 优化策略和元算法
8.1 批标准化
重参数化显著减少了多层之间协调更新的问题。 批标准化可应用于网络的任何输入层或隐藏层。 设 H是需要标准化的某层的小批量激活函数,排布为设计矩阵,每个样本的激活出现在矩阵的每一行中。 为了标准化H,我们将其替换为
其中 μ 是包含每个单元均值的向量, σ 是包含每个单元标准差的向量。 此处的算术是基于广播向量 μ 和向量 σ 应用于矩阵 H的每一行。 在每一行内,运算是逐元素的,因此 $$H _{(i,j)}$$ 标准化为减去 $$μ_j$$ 再除以 $$σ_j$$ 。
在 训练阶段 ,
其中 δ 是个很小的正值,比如 $$10^{−8}$$ ,以强制避免遇到z的梯度在 z = 0 处未定义的问题。
至关重要的是,我们通过反向传播这些操作来计算均值和标准差,并应用它们于标准化 H 。 这意味着,梯度不会再简单地增加 h i的标准差或均值;标准化操作会除掉这一操作的影响,归零其在梯度中的元素。
以前的方法添加代价函数的惩罚,以鼓励单元标准化激活统计量,或是在每个梯度下降步骤之后重新标准化单元统计量。
前者通常会导致不完全的标准化,而后者通常会显著地消耗时间,因为学习算法会反复改变均值和方差而标准化步骤会反复抵消这种变化。
批标准化重参数化模型,以使一些单元总是被定义标准化,巧妙地回避了这两个问题。
在 测试阶段 , μ 和 σ 可以被替换为训练阶段收集的运行均值。 这使得模型可以对单一样本评估,而无需使用定义于整个小批量的 μ和 σ 。
标准化一个单元的均值和标准差会降低包含该单元的神经网络的表达能力。 为了保持网络的表现力,通常会将批量隐藏单元激活 H 替换为 γ H ′ +β ,而不是简单地使用标准化的 H ′ 。 变量 γ 和 β 是允许新变量有任意均值和标准差的学习参数。
乍一看,这似乎是无用的——为什么我们将均值设为 0 ,然后又引入参数允许它被重设为任意值 β ?答案是新的参数可以表示旧参数作为输入的同一族函数,但是新参数有不同的学习动态。 在旧参数中, H 的均值取决于 H 下层中参数的复杂关联。
在新参数中, γ H ′ + β 的均值仅由 β 确定。 新参数很容易通过梯度下降来学习。
8.2 坐标下降
在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。 如果我们相对于某个单一变量 x i 最小化 f ( x ),然后相对于另一个变量 x j 等等,反复循环所有的变量,我们会保证到达(局部)极小值。 这种做法被称为坐标下降,因为我们一次优化一个坐标。
更一般地,块坐标下降是指对于某个子集的变量同时最小化。 术语”坐标下降”通常既指块坐标下降,也指严格的单个坐标下降。
当优化问题中的不同变量能够清楚地分成相对独立的组,或是当优化一组变量明显比优化所有变量效率更高时,坐标下降最有意义。
8.3 Polyak平均
Polyak平均会平均优化算法在参数空间访问轨迹中的几个点。 如果 t 次迭代梯度下降访问了点 θ ( 1 ) , … , θ (t ) ,那么Polyak平均算法的输出是 $$ θ^t = 1 /t ∑_ iθ^i$$ 。
在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。 当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好。
基本想法是,优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。 尽管两边所有位置的均值应比较接近谷底。
在非凸问题中,优化轨迹的路径可以非常复杂,并且经过了许多不同的区域。
包括参数空间中遥远过去的点,可能与当前点在代价函数上相隔很大的障碍,看上去不像一个有用的行为。
其结果是,当应用Polyak平均于非凸问题时,通常会使用指数衰减计算平均值:
8.4 监督预训练
有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务的挑战可能太大。
训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。 这些在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练。
贪心算法将问题分解成许多部分,然后独立地在每个部分求解最优值。 令人遗憾的是,结合各个最佳的部分不能保证得到一个最佳的完整解。
然而,贪心算法计算上比求解最优联合解的算法高效得多,并且贪心算法的解在不是最优的情况下,往往也是可以接受的。
贪心算法也可以紧接一个精调阶段,联合优化算法搜索全问题的最优解。 使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。
8.5 设计有助于优化的模型
在实践中,选择一族容易优化的模型比使用一个强大的优化算法更重要。
具体来说,现代神经网络的设计选择体现在层之间的线性变换,几乎处处可导的激活函数,和大部分定义域都有明显的梯度。
特别地,创新的模型,如LSTM,整流线性单元和maxout单元都比先前的模型(如基于sigmoid单元的深度网络)使用更多的线性函数。
这些模型都具有简化优化的性质。 如果线性变换的Jacobian具有相对合理的奇异值,那么梯度能够流经很多层。
此外,线性函数在一个方向上一致增加,所以即使模型的输出远离正确值,也可以简单清晰地计算梯度,使其输出方向朝降低损失函数的方向移动。
换言之,现代神经网络的设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。
其他的模型设计策略有助于使优化更简单。 例如,层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度,因而缓解了梯度消失的问题。
一个和跳跃连接相关的想法是添加和网络中间隐藏层相连的输出的额外副本,如GoogLeNet和深度监督网络。
这些”辅助头”被训练来执行和网络顶层主要输出相同的任务,以确保底层网络能够接受较大的梯度。 当训练完成时,辅助头可能被丢弃。
这是前一小节介绍到的预训练策略的替代方法。
以这种方式,我们可以在一个阶段联合训练所有层,而不改变架构,使得中间层(特别是低层)能够通过更短的路径得到一些如何更新的有用信息。
这些信息为底层提供了误差信号。
8.6 延拓法和课程学习
延拓法是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间。 延拓法的背后想法是构造一系列具有相同参数的目标函数。
为了最小化代价函数 J ( θ ) ,我们构建新的代价函数 J ( 0 ) , … , J ( n ) 。
这些代价函数的难度逐步提高,其中 J ( 0 ) 是最容易最小化的, J ( n ) 是最难的,真正的代价函数驱动整个过程。 当我们说J ( i ) 比 J ( i + 1 ) 更容易时,是指其在更多的 θ 空间上表现良好。
随机初始化更有可能落入局部下降可以成功最小化代价函数的区域,因为其良好区域更大。 这系列代价函数设计为前一个解是下一个的良好初始点。
因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求解真正问题的解。